package com.cskaoyan.javase.array._5operation._0traverse;

/**
 * 数组的基本操作,最最基本的就是数组元素的遍历
 * 遍历: 从头到尾访问一遍元素,数组的遍历我们可以从头到尾打印一遍数组元素
 *
 * 我们通过数组的遍历一整个改进的过程,主要还是强调写代码,学习不是一蹴而就的,要反复的重复和修改
 * @since 11:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 静态初始化一个int数组
        int[] arr = {1, 2, 3};
        // System.out.println(arr[0]);
        // System.out.println(arr[1]);
        // System.out.println(arr[2]);
        // 用循环改进
        // for (int i = 0; i < 3; i++) {
        //     System.out.println(arr[i]);
        // }
        // 继续改进
        // 复用代码,提取方法,使用快捷键ctrl+alt+M
        // arr = _1new int[0];
        arr = null;
        traverse6(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    // 继续改进,上面方法的遍历输出格式不够美观,我们希望它更美观
    // 比如数组有三个元素1,2,3.我们希望输出格式是: [1, 2, 3]
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // 去掉最后元素的空格和逗号
            if (i == arr.length - 1) {
                // 最后一个元素
                System.out.print(arr[i]);
                // 立刻结束循环
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    // 改进用转义字符去掉最后元素的空格和逗号
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        以上方法,虽然格式已经很美观,但是对于特殊的数组还是不能处理
        比如长度为0的数组
        比如等于null的数组
     */
    // 改进,让方法能够接收长度为0的数组的输入,在控制台打印 "[]"
    public static void traverse4(int[] arr) {
        if (arr.length != 0) {
            // 长度不为0,就遍历它
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + ", ");
            }
            System.out.println("\b\b]");
            // 用return结束方法,可以少写一个else
            return;
        }
        System.out.println("[]");
        System.out.println("您输入的数组长度为0!请重新输入!");
    }

    // 改进上面一个方法
    /*
        思考:
            大括号会增加代码层次,如果非要写大括号了,比如for循环,if判断,那么里面的代码是越少越好,还是越多越好?
            肯定是越少越好
     */
    public static void traverse5(int[] arr) {
        if (arr.length == 0) {
            // 长度为0,直接给出提示结束方法即可
            System.out.println("[]");
            System.out.println("您输入的数组长度为0!请重新输入!");
            // 用return结束方法,可以少写一个else
            return;
        }
        // 代码执行到这里,数组长度一定不为0
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        继续改进,让方法能够接收null数组的输入
     */
    public static void traverse6(int[] arr) {

        // 应该单独判断null,单独处理
        if (arr == null){
            // null数组
            System.out.println("您输入的数组是null数组,请重新输入!");
            return;
        }
        // 程序运行到这里,数组肯定不是null,避免了空指针异常
        if (arr.length == 0) {
            // 长度为0,直接给出提示结束方法即可
            System.out.println("[]");
            System.out.println("您输入的数组长度为0!请重新输入!");
            // 用return结束方法,可以少写一个else
            return;
        }
        // 代码执行到这里,数组长度一定不为0
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

}
